package savantConn;

import io.minio.MinioClient;
import io.minio.Result;
import io.minio.messages.Bucket;
import io.minio.messages.DeleteError;
import io.minio.messages.Item;
import java.io.InputStream;
import java.util.List;
import lombok.Data;


@Data
public class MinIOTool {

  private static String endpoint = "localhost";
  private static int port = 9000;
  private static String accessKey = "minioadmin";
  private static String secretKey = "minioadmin";

  //端口9000
  //secure	boolean	如果是true，则用的是https而不是http,默认值是true。
  private static MinioClient minioClient = new MinioClient(endpoint, 9000, accessKey, secretKey,
      false);

  // 通过文件路径上传
  public static void uploadFile(String bucketName, String objectName, String filePath)
      throws Exception {
    //通过文件上传到桶对象
    minioClient.putObject(bucketName, objectName, filePath, null);
  }

  //通过流上传
  public static void uploadFile(String bucketName, String objectName, InputStream inputStream)
      throws Exception {
    //通过文件上传到桶对象
    minioClient.putObject(bucketName, objectName, inputStream, null);
  }

  public static void main(String[] args) throws Exception {
    uploadFile("test", "images.jpg", "D:\\images.jpg");

  }

  public void makeBucket(String bucketName) throws Exception {

    //创建桶
    minioClient.makeBucket(bucketName);
  }

  public boolean bucketExists(String bucketName) throws Exception {

    //判断桶是否存在
    return minioClient.bucketExists(bucketName);
  }

  public List<Bucket> listBuckets() throws Exception {
    // 列出所有存储桶
    return minioClient.listBuckets();
  }

  public void removeBucket(String bucketName) throws Exception {
    // 删除存储桶，注意，只有存储桶为空时才能删除成功。
    minioClient.removeBucket(bucketName);
  }

  //todo 还有问题，待测试
//    public void upload(String bucketName,String objectName,ByteArrayInputStream bais)throws Exception{
//        //单个对象的最大大小限制在5TB。putObject在对象大于5MiB时，自动使用multiple parts方式上传
//        // 创建对象
//        Map<String,String> map= Maps.newLinkedHashMap();
//        map.put("content-type","application/octet-stream");
//
//        minioClient.putObject(bucketName, objectName, bais, bais.available(), map);
//        bais.close();
//    }

  public Iterable<Result<Item>> listObjects(String bucketName) throws Exception {
    //列出桶内所有对象
    return minioClient.listObjects(bucketName);
  }

  public void downLoad(String bucketName, String objectName) throws Exception {
    //以流的形式下载对象
    // 调用statObject()来判断对象是否存在。
    // 如果不存在, statObject()抛出异常,
    // 否则则代表对象存在。
    minioClient.statObject(bucketName, objectName);

    // 获取"myobject"的输入流。
    InputStream stream = minioClient.getObject(bucketName, objectName);

    // 读取输入流直到EOF并打印到控制台。
    byte[] buf = new byte[16384];
    int bytesRead;
    while ((bytesRead = stream.read(buf, 0, buf.length)) >= 0) {
      System.out.println(new String(buf, 0, bytesRead));
    }

    // 关闭流，此处为示例，流关闭最好放在finally块。
    stream.close();
  }

  public void downLoadSaveLocal(String bucketName, String objectName, String fileName)
      throws Exception {
    //下载将文件保存本地
    // 调用statObject()来判断对象是否存在。
    // 如果不存在, statObject()抛出异常,
    // 否则则代表对象存在。
    minioClient.statObject(bucketName, objectName);

    // 获取myobject的流并保存到photo.jpg文件中。
    minioClient.getObject(bucketName, objectName, fileName);

  }

  public void removeObject(String bucketName, String objectName) throws Exception {
    //删除一个对象
    minioClient.removeObject(bucketName, objectName);
  }

  public void removeMultiObject(String bucketName, List<String> objectNames) throws Exception {
    // 删除my-bucketname里的多个对象
    for (Result<DeleteError> errorResult : minioClient.removeObjects(bucketName, objectNames)) {
      DeleteError error = errorResult.get();
      System.out.println("Failed to remove '" + error.objectName() + "'. Error:" + error.message());
    }
  }

  public void removeIncompleteUpload(String bucketName, String objectName) throws Exception {
    //删除一个未完整上传的对象
    // 从存储桶中删除名为objectName的未完整上传的对象。
    minioClient.removeIncompleteUpload(bucketName, objectName);
  }
}